﻿#ifndef EDGEFINDER_H
#define EDGEFINDER_H

#include <QImage>
#include <QRect>

// MEASURE_DIR 表示当前测点是测量横向距离还是竖向距离。还有寻边的方向
enum MEASURE_DIR {TOP_BOTTOM, BOTTOM_TOP, LEFT_RIGHT, RIGHT_LEFT};

// MEASURE_PATTERN 表示寻边时的依据的特征
enum MEASURE_PATTERN{WHITE_BLACK, BLACK_WHITE};

/**
 * @brief The EdgeFinder class
 * 用于 B3 模组测量显微镜，在一个图像中抓取一个横边或者竖边。
 */
class EdgeFinder
{
public:
    EdgeFinder();
    /**
     * @brief measure 在一个图像中抓取一个横边或者竖边。返回这个边 相对于图像中心点的偏移距离。
     * @param grayImage 输入图像，已经转换为灰度图像了。
     * @param dir 用于区分这个待抓取边是横边还是竖边，还有这个边位于 Panel 的哪边。
     *            通常我们在 ROI 区域里能找到不止 1 条边。这时可以通过 dir 来区分哪个边是我们需要的。
     *            TOP_BOTTOM 表示从上往下找到的第一条边是我们希望获取的边。
     *            BOTTOM_TOP 表示从下往上找到的第一条边是我们希望获取的边。
     *            LEFT_RIGHT 表示从左往右找到的第一条边是我们希望获取的边。
     *            RIGHT_LEFT 表示从右往左找到的第一条边是我们希望获取的边。
     * @param pattern 用于标志这个边的特征。
     *                比如 dir 是 BOTTOM_TOP，pattern 是 WHITE_BLACK 时说明在图像上这个边是上面黑色下面白色的。
     *                （从 BOTTOM 到 TOP 是 WHITE 到 BLACK 的）
     * @param roi   ROI 区域，当 roi 为 0 时则整个图像都是 ROI 区域。
     * @return 返回这条边距离图像中心点的距离，以像素为单位。
     *         返回 -1 表示没能抓取到符合条件的边。
     *         返回 -2 表示抓取到的边斜率偏离正常值太大（大于 10 度）
     */
    double measure(const QImage &grayImage, MEASURE_DIR dir, MEASURE_PATTERN pattern, QRect roi);


private:

    MEASURE_PATTERN m_pattern;
    MEASURE_DIR m_dir;
    QRect m_roi;
};



#endif // EDGEFINDER_H
